//============================================================================================
/**
 * @file	guinness_app.c
 * @brief	ギネスアプリ
 * @author	Nozomu Saito
 *
 * モジュール名：Gns_
 */
//============================================================================================

#include "common.h"
#include "system/procsys.h"
#include "system/arc_util.h"
#include "system/snd_tool.h"
#include "system/touch_subwindow.h"
#include "system/wipe.h"
#include "system/clact_tool.h"
#include "system/wordset.h"
#include "system/msgdata_util.h"
#include "system/fontproc.h"
#include "system/pmfprint.h"

#include "gflib/touchpanel.h"

#include "savedata/savedata.h"
#include "savedata/guinness.h"
#include "savedata/config.h"

#include "guinness.naix"

#include "guinness_app.h"

#include "system/window.h"
#include "msgdata/msg_ranking.h"
#include "msgdata/msg.naix"

#include "application/app_tool.h"		//for APP_WINCLR_COL

#define GNS_MEM_SIZE	(0x10000)

//** CharManager PlttManager用 **//
#define CHAR_CONT_NUM				(10)		//適当
#define CHAR_VRAMTRANS_MAIN_SIZE		(64*1024)
#define CHAR_VRAMTRANS_SUB_SIZE		(16*1024)
#define PLTT_CONT_NUM				(1)

#define OBJ_BG_PRI	(3)

#define CUR_POS_MAX	(7)

//アニメ（セルアニメデータ依存）
#define EXIT_ANM	(0)
#define CUR_ANM_1	(2)
#define CUR_ANM_2	(7)
#define ARW_L_ANM	(3)
#define ARW_R_ANM	(5)
#define DEL_ANM		(8)
#define AF_EXIT_ANM		(1)
#define AF_ARW_L_ANM	(4)
#define AF_ARW_R_ANM	(6)
#define AF_DEL_ANM		(9)


#define ARW_L_X	(2*8)
#define ARW_L_Y	(12*8)
#define ARW_R_X	(30*8)
#define ARW_R_Y	(12*8)
#define EXIT_X	(28*8)
#define EXIT_Y	(22*8)
#define DEL_X	(8*8)
#define DEL_Y	(22*8)

//下画面パレット本数
#define MAIN_PAL_NUM	(2)
//上画面パレット本数
#define SUB_PAL_NUM		(1)

//セルアクター最大数
#define CELL_ACTOR_MAX			( 5 )	//カーソル1+矢印ｘ2+やめるボタン1+削除ボタン1

//タッチ箇所数
#define TOUCH_RECT_MAX		(10)

#define GNS_NUM		(6)
#define DEL_TP_IDX		(6)
#define EXIT_TP_IDX		(7)
#define L_TP_IDX		(8)
#define R_TP_IDX		(9)

#define TP_GNS_BASE_X	(5*8)
#define TP_GNS_BASE_Y	(7*8)
#define TP_GNS_W		(22*8)
#define TP_GNS_H		(2*8)

#define TP_DEL_BASE_X	(2*8)
#define TP_DEL_BASE_Y	(21*8)
#define TP_DEL_W	(14*8)
#define TP_DEL_H	(2*8)

#define TP_EXIT_BASE_X	(EXIT_X-(TP_EXIT_W/2))
#define TP_EXIT_BASE_Y	(EXIT_Y-(TP_EXIT_H/2))
#define TP_EXIT_W	(8*8)
#define TP_EXIT_H	(2*8)

#define TP_L_BASE_X	(ARW_L_X)
#define TP_L_BASE_Y	(ARW_L_Y)
#define TP_L_RANGE	(2*8)
#define TP_R_BASE_X	(ARW_R_X)
#define TP_R_BASE_Y	(ARW_R_Y)
#define TP_R_RANGE	(2*8)


#define RANKLIST_MAX	(7)	///<ランキングリストの最大数
#define UNITBUF_NUM	(7)		///<単位系メッセージバッファ数
#define MSGBUF_NUM	(3)		///<メッセージ系バッファ数
#define WORDSET_RANKING_BUFLEN	(38*2)


#define BTN_FONT_PALNO		(1)		//ボタン用フォントパレット（ＢＧパレット依存）
#define FONT_PALNO_NORMAL	(15)

//BMP
//ブロックウィンドウ
#define RNK_WIN_PX		(5)
#define RNK_WIN_PY		(7)
#define RNK_WIN_SX		(2)
#define RNK_WIN_SY		(12)
#define RNK_WIN_SIZE	(RNK_WIN_SX*RNK_WIN_SY)
#define RNK_WIN_CGX	(1)

#define LIST_WIN_PX		(7)
#define LIST_WIN_PY		(7)
#define LIST_WIN_SX		(20)
#define LIST_WIN_SY		(12)
#define LIST_WIN_SIZE	(LIST_WIN_SX*LIST_WIN_SY)
#define LIST_WIN_CGX	(RNK_WIN_CGX+RNK_WIN_SIZE)

#define MSG_WIN_PX		(2)
#define MSG_WIN_PY		(1)
#define MSG_WIN_SX		(28)
#define MSG_WIN_SY		(4)
#define MSG_WIN_SIZE	(MSG_WIN_SX*MSG_WIN_SY)
#define MSG_WIN_CGX		(LIST_WIN_CGX + LIST_WIN_SIZE)

#define EXIT_WIN_PX		(25)
#define EXIT_WIN_PY		(21)
#define EXIT_WIN_SX		(6)
#define EXIT_WIN_SY		(2)
#define EXIT_WIN_SIZE	(EXIT_WIN_SX*EXIT_WIN_SY)
#define EXIT_WIN_CGX	( MSG_WIN_CGX + MSG_WIN_SIZE )

#define DEL_WIN_PX		(4)
#define DEL_WIN_PY		(21)
#define DEL_WIN_SX		(12)
#define DEL_WIN_SY		(2)
#define DEL_WIN_SIZE	(DEL_WIN_SX*DEL_WIN_SY)
#define DEL_WIN_CGX		( EXIT_WIN_CGX + EXIT_WIN_SIZE )


#define TALK_WIN_CGX	(1)
#define TALK_WIN_PAL	(12)
#define YN_MSG_WIN_PX		(2)
#define YN_MSG_WIN_PY		(1)
#define YN_MSG_WIN_SX		(28)
#define YN_MSG_WIN_SY		(4)
#define YN_MSG_WIN_SIZE	(YN_MSG_WIN_SX*YN_MSG_WIN_SY)
#define YN_MSG_WIN_CGX		( TALK_WIN_CGX + TALK_WIN_CGX_SIZ )

#define MENU_BMP_CHR_OFS	(YN_MSG_WIN_CGX+YN_MSG_WIN_SIZE)

//YESNO描画位置
#define YESNO_X	(25)
#define YESNO_Y	(6)
#define YESNO_PAL	(13)

#define BRIGHT_VAL	(-7)

#define	MSG_FONT_COLOR		(GF_PRINTCOLOR_MAKE( 1, 2, 0))
#define	MSG_BTN_FONT_COLOR		(GF_PRINTCOLOR_MAKE( 3, 1, 0))

//SE定義
#define SE_MOVE		(SEQ_SE_DP_SELECT)		//カーソル移動
#define	SE_SELECT	(SEQ_SE_DP_DECIDE)		//選択
#define	SE_EXIT		(SEQ_SE_DP_DECIDE)		//もどる
#define SE_NG		(SEQ_SE_DP_CUSTOM06)	//データ消せない
#define SE_PAGE		(SEQ_SE_DP_SELECT78)	//ページ切り替え
#define	SE_CHG_DEL	(SEQ_SE_DP_DECIDE)		//削除モードへ

typedef struct _RANK{
	GNS_RECORD*	GnsRec;	//レコードデータへのポインタ
	u16	ValidFlg;	//有効無効フラグ
	u8	MyID;		//自分のデータへのindex
}RANK;

typedef struct _RANK_LIST{
	int		Num;	//リストの項目数
	RANK	List[RANKLIST_MAX];
}RANK_LIST;

typedef struct _RANK_UNIT{
	u32	Max;	///<最大値
	u16	Keta;	///<桁数
	u16	Unit;	///<単位系ナンバー
}RANK_UNIT;

typedef struct _RANK_MSG{
	MSGDATA_MANAGER*	Man;

	WORDSET* WordSet;	//ワーク
	STRBUF*	tmp;	//汎用
	STRBUF* nbuf;	//名前
	STRBUF* rnkbuf;	//順位
	STRBUF*	ubuf[UNITBUF_NUM];	//単位
}RANK_MSG;

typedef struct GNS_WORK_tag
{
	GF_BGL_INI *Bgl;
	GF_BGL_BMPWIN	RnkWin;
	GF_BGL_BMPWIN	BmpWin;
	GF_BGL_BMPWIN	MsgWin;
	GF_BGL_BMPWIN	ExitWin;
	GF_BGL_BMPWIN	DelWin;
	GF_BGL_BMPWIN	YNMsgWin;

	RANK_MSG		Msg;

	// 下画面ウインドウシステム
	TOUCH_SW_SYS *TouchSubWindowSys;

	// セルアクター関連
	CLACT_SET_PTR	ClactSet;				// セルアクターセット
	CLACT_U_EASYRENDER_DATA RendData;			// 簡易レンダーデータ
	CLACT_U_RES_MANAGER_PTR ResMan[CLACT_U_RES_MAX];	// リソースマネージャ
	CLACT_U_RES_OBJ_PTR ResObjTbl[CLACT_U_RES_MAX];	// リソースオブジェテーブル
	CLACT_HEADER ClActHeader;

	CLACT_WORK_PTR Cur;
	CLACT_WORK_PTR BtnR;
	CLACT_WORK_PTR BtnL;
	CLACT_WORK_PTR ExitBtn;
	CLACT_WORK_PTR DelBtn;

	RECT_HIT_TBL	*TouchRect;

	u8 Seq;
	u8 Mode;
	s8 CurPosIdx;
	u8 Scene;

	///セーブデータ操作関連
	GUINNESS*		GnsSave;
	GNS_RANKING*	Rank[7];
	RANK_LIST*		ViewList;
	RANK*			DelRank;

	u8 DataType;	//バトル・ポケ・コンテスト(コンテストは金銀では見ない)
	u8 GrpType;		//グローバル・グループ
	u8 BlockNum;	//項目数
	u8 GnsIdx;

	u8 SelBlock;	//選んだ項目
	u8 RecListNum;	//現在の表示レコードリストの数
	u8 ListIdx[6];

	u8 WinType;
	u8 dummy[3];

}GNS_WORK;

typedef struct CURPOS_tag
{
	int X;
	int Y;
	int Anm;
}CURPOS;

typedef enum
{
	SEQ_BLACK_IN,
	SEQ_BLACK_IN_WAIT,
	SEQ_MAIN,
	SEQ_BLACK_OUT,
	SEQ_BLACK_OUT_WAIT,
	SEQ_REWRITE,
}SEQ_GNS;

typedef enum
{
	SCENE_REWRITE,
	SCENE_MAIN,
	SCENE_YESNO,
	SCENE_DEL_NG,
	SCENE_DEL,
}SCENE_SEQ;

typedef enum
{
	REQ_NONE,
	REQ_CUR_UP,
	REQ_CUR_DOWN,
	REQ_CUR_JUMP,
	REQ_EXIT,
	REQ_DEL,
	REQ_LEFT,
	REQ_RIGHT,
	REQ_DECIDE,
}REQ_TYPE;

typedef enum
{
	GNS_MODE_VIEW,
	GNS_MODE_DEL,
}GNS_MODE;

//カーソル位置テーブル
const CURPOS CurPos[CUR_POS_MAX] = {
	{16*8, 8*8, CUR_ANM_2},
	{16*8, 8*8+2*8, CUR_ANM_2},
	{16*8, 8*8+4*8, CUR_ANM_2},
	{16*8, 8*8+6*8, CUR_ANM_2},
	{16*8, 8*8+8*8, CUR_ANM_2},
	{16*8, 8*8+10*8, CUR_ANM_2},
	{EXIT_X,EXIT_Y, CUR_ANM_1},
};

///リスト描画単位系データ
static const RANK_UNIT unit_btl[] = {
 {9999,4,msg_rk_count_00},
 {9999,4,msg_rk_count_00},
 {9999,4,msg_rk_count_00},
 {9999,4,msg_rk_count_00},
 {9999,4,msg_rk_count_00},
 {7,1,msg_rk_count_01},
};
static const RANK_UNIT	unit_poke[] = {
 {999999,6,msg_rk_count_03},
 {999999,6,msg_rk_count_03},
 {999999,6,msg_rk_count_02},
 {999999,6,msg_rk_count_03},
};

static const RANK_UNIT* const unit_list[] = {
 unit_btl,unit_poke,
};


//ＢＭＰウィンドウ


static void InitFunc(PROC * proc);
static BOOL MainFunc(GNS_WORK *work);
static void DrawFunc(GNS_WORK *work);
static BOOL ReqMain(GNS_WORK *work);
static void YesNoMain(GNS_WORK *work);
static BOOL NGMain(GNS_WORK *work);
static void SetVRAMBank(void);
static void SetUpBGSys(GF_BGL_INI * ini);
static void InitCharPlttManager(void);
static void InitOAM(void);
static void VBlankFunc( void * work );
static void LoadBG(GF_BGL_INI * ini, const int inHeapID);
static void InitCellActor(GNS_WORK *work, const int inHeapID);
static void MakeCellActorHeader(GNS_WORK *work);
static void DeleteCellActor(GNS_WORK *work);
static void MakeCLACT_ADD(CLACT_ADD *add, GNS_WORK *work);
static void MakeActor(GNS_WORK *work);
static void MakeTouchData(GNS_WORK *work, const int inHeapID);
static REQ_TYPE GetRequest(GNS_WORK *work, int *outParam);
static BOOL ViewModeMain(GNS_WORK *work, const REQ_TYPE inReq, const int inParam);
static void DelModeMain(GNS_WORK *work, const REQ_TYPE inReq, const int inParam);
static void MoveCursor(GNS_WORK *work, const int inAddVal);
static void JumpCursor(GNS_WORK *work, const int inCurPosIdx);
static void UpdateCursor(GNS_WORK *work);
static void ChgSelBlock(GNS_WORK *work, const s8 inAddVal);
static void ChgMode(GNS_WORK *work, const GNS_MODE inMode);
static void CreateBmpWin(GNS_WORK *work);
static void ClearTalkWin(GNS_WORK *work);

static void GetSaveData(GNS_WORK *wk, SAVEDATA* sv);
static void GetMsgData(GNS_WORK *wk);
static void FreeMsgData(GNS_WORK *wk);
static void RecordMenuWrite(GNS_WORK *wk);
static void DelWinWrite(GNS_WORK *wk);
static void ExitWinWrite(GNS_WORK *wk);
static void DelOKWinWrite(GNS_WORK *wk);
static void DelMyDatWinWrite(GNS_WORK *wk);
static void TitleWinWrite(GNS_WORK *wk);
static void WhichWinWrite(GNS_WORK *wk);

static void YesnoCheckReady(GNS_WORK *work);
static void SetPassive(void);
static void ClearPassive(void);

static void SetSvData(GNS_WORK *wk);

//--------------------------------------------------------------------------------------------
/**
 * ギネス記録削除プロセス	初期化処理
 *
 * @param	proc			プロセス
 * @param	seq				シーケンス
 *
 * @return	PROC_RESULT		プロセスリターンコード
 */
//--------------------------------------------------------------------------------------------
PROC_RESULT Gns_Init(PROC * proc, int * seq)
{
	InitFunc(proc);
	return PROC_RES_FINISH;
}

//--------------------------------------------------------------------------------------------
/**
 * ギネス記録削除プロセス	メイン処理
 *
 * @param	proc			プロセス
 * @param	seq				シーケンス
 *
 * @return	PROC_RESULT		プロセスリターンコード
 */
//--------------------------------------------------------------------------------------------
PROC_RESULT Gns_Main(PROC * proc, int * seq)
{
	int selno, seltype;

	GNS_WORK *work = PROC_GetWork(proc);
//	OS_Printf("ポケモン選択画面メイン\n");
	switch(work->Seq){
	case SEQ_BLACK_IN:
		//ワイプスタート
		WIPE_SYS_Start(WIPE_PATTERN_WMS, WIPE_TYPE_FADEIN, WIPE_TYPE_FADEIN,
				WIPE_FADE_BLACK,WIPE_DEF_DIV,WIPE_DEF_SYNC,HEAPID_GUINNESS);
		work->Seq = SEQ_BLACK_IN_WAIT;
		break;
	case SEQ_BLACK_IN_WAIT:
		if ( WIPE_SYS_EndCheck() ){
			work->Seq = SEQ_MAIN;
		}
		break;
	case SEQ_MAIN:
		{
			BOOL rc;
			//OS_Printf("メイン処理中\n");
			rc = MainFunc(work);
			if ( rc ){
				work->Seq = SEQ_BLACK_OUT;
			}
		}
		break;
	case SEQ_BLACK_OUT:
		//ブラックアウト
		WIPE_SYS_Start(WIPE_PATTERN_WMS, WIPE_TYPE_FADEOUT, WIPE_TYPE_FADEOUT,
				WIPE_FADE_BLACK,WIPE_DEF_DIV,WIPE_DEF_SYNC,HEAPID_GUINNESS);
		work->Seq = SEQ_BLACK_OUT_WAIT;
		break;
	case SEQ_BLACK_OUT_WAIT:
		if ( WIPE_SYS_EndCheck() ){
			//セーブデータに反映
			SetSvData(work);
			OS_Printf("選択終了\n");
			return PROC_RES_FINISH;
		}
		break;
	}

	//アクター描画
	DrawFunc(work);

	return PROC_RES_CONTINUE;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケスロン参加ポケモン選択プロセス	終了処理
 *
 * @param	proc			プロセス
 * @param	seq				シーケンス
 *
 * @return	PROC_RESULT		プロセスリターンコード
 */
//--------------------------------------------------------------------------------------------
PROC_RESULT Gns_End(PROC * proc, int * seq)
{
	int i;
	GNS_WORK *work = PROC_GetWork(proc);

	OS_Printf("ギネス画面終了処理\n");

	// 上下画面を元に戻しておく
	sys.disp3DSW = DISP_3D_TO_MAIN;
	GF_Disp_DispSelect();

	//Ｖブランク関数停止
	sys_VBlankFuncChange( NULL, NULL );

	//ブレンドクリア
	G2_BlendNone();

	//メッセージデータ関連破棄
	FreeMsgData(work);

	//ＢＭＰ解放
	GF_BGL_BmpWinDel(&work->RnkWin);
	GF_BGL_BmpWinDel(&work->BmpWin);
	GF_BGL_BmpWinDel(&work->MsgWin);
	GF_BGL_BmpWinDel(&work->ExitWin);
	GF_BGL_BmpWinDel(&work->DelWin);
	GF_BGL_BmpWinDel(&work->YNMsgWin);

	//ＢＧ解放
	GF_BGL_BGControlExit(work->Bgl, GF_BGL_FRAME0_M);
	GF_BGL_BGControlExit(work->Bgl, GF_BGL_FRAME1_M);
	GF_BGL_BGControlExit(work->Bgl, GF_BGL_FRAME2_M);
	GF_BGL_BGControlExit(work->Bgl, GF_BGL_FRAME3_M);
	GF_BGL_BGControlExit(work->Bgl, GF_BGL_FRAME0_S);

	//アクター削除
	DeleteCellActor(work);
	// キャラ転送マネージャー破棄
	CLACT_U_CharManagerDelete(work->ResObjTbl[CLACT_U_CHAR_RES]);
	// パレット転送マネージャー破棄
	CLACT_U_PlttManagerDelete(work->ResObjTbl[CLACT_U_PLTT_RES]);
	// キャラ・パレット・セル・セルアニメのリソースマネージャー破棄
	for(i=0;i<CLACT_U_RES_MAX;i++){
		CLACT_U_ResManagerDelete(work->ResMan[i]);
	}
	// セルアクターセット破棄
	CLACT_DestSet(work->ClactSet);

	//フォント削除
	FontProc_UnloadFont(FONT_TOUCH);

	//OAMレンダラー破棄
	REND_OAM_Delete();
	// リソース解放
	DeleteCharManager();
	DeletePlttManager();
	// タッチシステムの開放
	TOUCH_SW_FreeWork(work->TouchSubWindowSys);
	//タッチ矩形解放
	sys_FreeMemoryEz(work->TouchRect);
	//BGL解放
	sys_FreeMemoryEz(work->Bgl);

	//セーブデータ取得領域解放
	{
		int i;
		for(i = 0;i < work->BlockNum+1;i++){
			GNSRank_FreeRankingData(work->Rank[i]);
		}
		sys_FreeMemoryEz(work->ViewList);
	}

	//メモリ解放
	sys_FreeMemoryEz(work);

	//ヒープ解放
	sys_DeleteHeap( HEAPID_GUINNESS );

	return PROC_RES_FINISH;
}

//--------------------------------------------------------------------------------------------
/**
 * 初期化
 *
 * @param	proc		プロックポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void InitFunc(PROC * proc)
{
	GNS_WORK *work;

	GNS_APP_HEADER *header = PROC_GetParentWork( proc );

	//ヒープ作成
	sys_CreateHeap( HEAPID_BASE_APP, HEAPID_GUINNESS, GNS_MEM_SIZE );

	//メモリアロケーション
	work = PROC_AllocWork(proc, sizeof(GNS_WORK), HEAPID_GUINNESS);
	//ワークはゼロクリア
	memset(work, 0, sizeof(GNS_WORK));

	//BGLアロケーション
	work->Bgl = GF_BGL_BglIniAlloc(HEAPID_GUINNESS);
	//ＶＲＡＭ割り当て
	SetVRAMBank();
	//ＢＧセットアップ
	SetUpBGSys(work->Bgl);
	//キャラ・パレットマネージャ初期化
	InitCharPlttManager();
	//ＯＡＭ初期化
	InitOAM();
	//セルアクター初期化・ポケモンアイコンパレット転送
	InitCellActor(work, HEAPID_GUINNESS);
	//セルアクターヘッダー作成
	MakeCellActorHeader(work);
	//下画面ウインドウシステム初期化
	work->TouchSubWindowSys = TOUCH_SW_AllocWork(HEAPID_GUINNESS);
	//コンフィグ
	work->WinType = CONFIG_GetWindowType(SaveData_GetConfig(header->SaveData));
	OS_Printf("ウィンドウタイプ%d\n",work->WinType);

	//Ｖブランク関数実行開始
	sys_VBlankFuncChange( VBlankFunc, work->Bgl );

	//シーケンス初期化
	work->Seq = SEQ_BLACK_IN;

	//メッセージプリント
	MSG_PrintInit();
	// ボタン用フォントの読み込み
	FontProc_LoadFont(FONT_TOUCH, HEAPID_GUINNESS);
	//ＢＧロード
	LoadBG(work->Bgl, HEAPID_GUINNESS);
	/* メッセージのフォントカラーを設定 */
	SystemFontPaletteLoad( PALTYPE_MAIN_BG, FONT_PALNO_NORMAL * 32, HEAPID_GUINNESS);
	//ＢＭＰ作成
	CreateBmpWin(work);
	//アクター作成
	MakeActor(work);
	//ＯＢＪ面ＯＮ
	GF_Disp_GX_VisibleControl(  GX_PLANEMASK_OBJ, VISIBLE_ON );	//メイン画面OBJ面ＯＮ
	//タッチ範囲作成
	MakeTouchData(work, HEAPID_GUINNESS);

	work->Scene = SCENE_MAIN;

	//ギネスセーブデータへのポインタ取得
	work->GnsSave = SaveData_GetGuinnessData(header->SaveData);
	//データタイプとグループタイプを取得
	work->DataType = header->Mode%3;
	work->GrpType = header->Mode/3;
	work->BlockNum = GNSRank_GetTypeBlockNum(work->DataType);
	work->GnsIdx	 = GNSRank_GetTypeGNSIDOfs(work->DataType);

	OS_Printf("データタイプ%d グループタイプ%d ブロック数%d ギネスインデックス%d 開始ページ%d\n",
			work->DataType, work->GrpType, work->BlockNum, work->GnsIdx, header->FirstPage);

	//セーブデータ取得
	GetSaveData(work, header->SaveData);
	//ブロック選択
	work->SelBlock = header->FirstPage;
	if (work->SelBlock >= work->BlockNum){
		GF_ASSERT(0);
		work->SelBlock = 0;
	}
	//メッセージ
	GetMsgData(work);
	//モード初期化（はじめはビューモード）
	ChgMode(work, GNS_MODE_VIEW);
	//ＢＭＰ描画
	RecordMenuWrite(work);
	DelWinWrite(work);
	ExitWinWrite(work);
	TitleWinWrite(work);
}

//--------------------------------------------------------------------------------------------
/**
 * メイン
 *
 * @param	work		ワークポインタ
 *
 * @return	BOOL		TRUEならアプリ終了
 */
//--------------------------------------------------------------------------------------------
static BOOL MainFunc(GNS_WORK *work)
{
	switch (work->Scene){
	case SCENE_REWRITE:
		//リスト再描画
		RecordMenuWrite(work);
		work->Scene = SCENE_MAIN;
		break;
	case SCENE_MAIN:
		if ( ReqMain(work) ){
			return TRUE;
		}
		break;
	case SCENE_YESNO:
		YesNoMain(work);
		break;
	case SCENE_DEL_NG:
		if ( NGMain(work) ){
			work->Scene = SCENE_MAIN;
		}
		break;
	case SCENE_DEL:
		//削除（表示フラグおとす）
		work->DelRank->ValidFlg = 0;
		work->Scene =  SCENE_REWRITE;
		break;
	}


	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * 描画関数
 *
 * @param	work		ワークポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void DrawFunc(GNS_WORK *work)
{
	if(work->ClactSet!=NULL){
		CLACT_Draw( work->ClactSet );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * メイン
 *
 * @param	work		ワークポインタ
 *
 * @return	BOOL		TRUEならアプリ終了
 */
//--------------------------------------------------------------------------------------------
static BOOL ReqMain(GNS_WORK *work)
{
	int param;
	REQ_TYPE req;
	req = GetRequest(work, &param);

	if (req == REQ_NONE){
		return FALSE;
	}

	//モードで分岐
	if (work->Mode == GNS_MODE_VIEW){		//ビューモード
		BOOL rc;
		rc = ViewModeMain(work, req, param);
		if (rc){
			return TRUE;	//終了
		}
	}else{		//削除モード
		DelModeMain(work, req, param);
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * YESNOメイン
 *
 * @param	work		ワークポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void YesNoMain(GNS_WORK *work)
{
	int selno;
	//確認
    selno = TOUCH_SW_Main( work->TouchSubWindowSys );
    switch(selno){
    case TOUCH_SW_RET_YES:		// はい
		//ウィンドウ削除
///		DeleteWindow(&ptr->MsgWin, TRUE);
		TOUCH_SW_Reset( work->TouchSubWindowSys );
		//パッシブ解除
		ClearPassive();

		//データ消す（非表示にする）シーンにシフト
		work->Scene = SCENE_DEL;
		//会話ウィンドウに説明表示
		WhichWinWrite(work);
		break;
    case TOUCH_SW_RET_NO:		// いいえ
		//ウィンドウ削除
///		DeleteWindow(&ptr->MsgWin, TRUE);
		TOUCH_SW_Reset( work->TouchSubWindowSys );
		//パッシブ解除
		ClearPassive();
		//リクエストメインシーンにシフト
		work->Scene = SCENE_MAIN;
		//会話ウィンドウに説明表示
		WhichWinWrite(work);
      break;
    }
}

//--------------------------------------------------------------------------------------------
/**
 * NGメイン
 *
 * @param	work		ワークポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static BOOL NGMain(GNS_WORK *work)
{
	if( sys.trg || GF_TP_GetTrg() ){
		//会話ウィンドウに説明表示
		WhichWinWrite(work);
		return TRUE;
	}

	return FALSE;
}

//----------------------------------------------------------------------------
/**
 *	@brief	VRAM割り当て
 *
 *	@param	none
 *
 *	@return none
 */
//-----------------------------------------------------------------------------
static void SetVRAMBank(void)
{
	GF_BGL_DISPVRAM tbl = {
		GX_VRAM_BG_128_A,				// メイン2DエンジンのBG
		GX_VRAM_BGEXTPLTT_NONE,			// メイン2DエンジンのBG拡張パレット

		GX_VRAM_SUB_BG_128_C,			// サブ2DエンジンのBG
		GX_VRAM_SUB_BGEXTPLTT_NONE,		// サブ2DエンジンのBG拡張パレット

		GX_VRAM_OBJ_64_E,				// メイン2DエンジンのOBJ
		GX_VRAM_OBJEXTPLTT_NONE,		// メイン2DエンジンのOBJ拡張パレット

		GX_VRAM_SUB_OBJ_16_I,			// サブ2DエンジンのOBJ
		GX_VRAM_SUB_OBJEXTPLTT_NONE,	// サブ2DエンジンのOBJ拡張パレット

		GX_VRAM_TEX_0_B,				// テクスチャイメージスロット
		GX_VRAM_TEXPLTT_01_FG			// テクスチャパレットスロット
	};

	GF_Disp_SetBank( &tbl );

}

//----------------------------------------------------------------------------
/**
 *	@brief	BGシステムセットアップ
 *
 *	@param	ini		BGL
 *
 *	@return none
 */
//-----------------------------------------------------------------------------
static void SetUpBGSys(GF_BGL_INI * ini)
{
	// 上下画面をひっくり返す
	sys.disp3DSW = DISP_3D_TO_SUB;
	GF_Disp_DispSelect();

	{	/* BG SYSTEM */
    	GF_BGL_SYS_HEADER BGsys_data = {
      		GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BGMODE_0, GX_BG0_AS_2D,
    	};
    	GF_BGL_InitBG( &BGsys_data );
  	};

	{	/* MAIN DISP BG0 */			//YESNOテキスト面
		GF_BGL_BGCNT_HEADER MBg0_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xf800, GX_BG_CHARBASE_0x00000,
      		GX_BG_EXTPLTT_01, 0, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( ini, GF_BGL_FRAME0_M, &MBg0_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME0_M );
	}

	{	/* MAIN DISP BG1 */			//書き換えテキスト面
		GF_BGL_BGCNT_HEADER MBg1_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xf000, GX_BG_CHARBASE_0x08000,
      		GX_BG_EXTPLTT_01, 1, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( ini, GF_BGL_FRAME1_M, &MBg1_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME1_M );
	}

	{	/* MAIN DISP BG2 */		//書き換え不要テキスト面
		GF_BGL_BGCNT_HEADER MBg2_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xe000, GX_BG_CHARBASE_0x08000,
      		GX_BG_EXTPLTT_01, 2, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( ini, GF_BGL_FRAME2_M, &MBg2_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME2_M );
	}

	{	/* MAIN DISP BG3 */		//背景面
		GF_BGL_BGCNT_HEADER MBg3_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xd800, GX_BG_CHARBASE_0x10000,
      		GX_BG_EXTPLTT_01, 3, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( ini, GF_BGL_FRAME3_M, &MBg3_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME3_M );
	}

	{	/* SUB DISP BG0 */				//壁紙テキスト面
    	GF_BGL_BGCNT_HEADER SBg0_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xf000, GX_BG_CHARBASE_0x00000,
      		GX_BG_EXTPLTT_01, 0, 0, 0, FALSE
    	};
    	GF_BGL_BGControlSet( ini, GF_BGL_FRAME0_S, &SBg0_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME0_S );
	}

	//1キャラ目をＮＵＬＬデータでフィルする
	GF_BGL_CharFill(ini, GF_BGL_FRAME0_M, 0, 1 ,0);
	GF_BGL_CharFill(ini, GF_BGL_FRAME1_M, 0, 1 ,0);
	GF_BGL_CharFill(ini, GF_BGL_FRAME2_M, 0, 1 ,0);
}

//------------------------------------------------------------------
/**
 * @brief	キャラクタ、パレットのマネージャー起動
 * @param	NONE
 * @return	NONE
 */
//------------------------------------------------------------------
static void InitCharPlttManager(void)
{
	// キャラクタマネージャー初期化
	{
		CHAR_MANAGER_MAKE cm = {
			CHAR_CONT_NUM,
			CHAR_VRAMTRANS_MAIN_SIZE,
			CHAR_VRAMTRANS_SUB_SIZE,
			HEAPID_GUINNESS,
		};
		InitCharManager(&cm);
	}
	// パレットマネージャー初期化
	InitPlttManager(PLTT_CONT_NUM, HEAPID_GUINNESS);

	// 読み込み開始位置を初期化
	CharLoadStartAll();
	PlttLoadStartAll();
}

//------------------------------------------------------------------
/**
 * @brief	OAMの初期化
 * @param	NONE
 * @return	NONE
 */
//------------------------------------------------------------------
static void InitOAM(void)
{
	int i;
	// OAMマネージャーの初期化
	NNS_G2dInitOamManagerModule();
	// 共有OAMマネージャ作成
	// レンダラ用OAMマネージャ作成
	// ここで作成したOAMマネージャをみんなで共有する
	REND_OAMInit(
			0, 126,		// メイン画面OAM管理領域
			0, 32,		// メイン画面アフィン管理領域
			0, 126,		// サブ画面OAM管理領域
			0, 32,		// サブ画面アフィン管理領域
			HEAPID_GUINNESS);
}

//----------------------------------------------------------------------------
/**
 *	@brief	Vブランク関数
 *
 *	@param	void * work 	ワーク
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void VBlankFunc( void * work )
{

   GF_BGL_INI *bgl = (GF_BGL_INI *)work;
	// レンダラ共有OAMマネージャVram転送
	REND_OAMTrans();

	//BGL
	GF_BGL_VBlankFunc(bgl);

	DoVramTransferManager();

	OS_SetIrqCheckFlag( OS_IE_V_BLANK );
}

//----------------------------------------------------------------------------
/**
 *	@brief	BGロード
 *
 *	@param	ini			BGL
 *  @param	inHeapID	ヒープID
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void LoadBG(GF_BGL_INI * ini, const int inHeapID)
{
	// メイン画面BGパレット転送
	ArcUtil_PalSet(	ARC_GUINNESS_GRA, NARC_guinness_guinness_bg_d_nclr, PALTYPE_MAIN_BG,
					0, 32*MAIN_PAL_NUM, inHeapID);
	// メイン画面BGキャラ転送
	ArcUtil_BgCharSet(ARC_GUINNESS_GRA, NARC_guinness_guinness_bg_d_lz_ccgr, ini,
			    GF_BGL_FRAME3_M, 0, 32*4*0x20, 1, inHeapID);
	// メイン画面スクリーン
	ArcUtil_ScrnSet(ARC_GUINNESS_GRA, NARC_guinness_guinness_bg_d_lz_cscr, ini,
			  GF_BGL_FRAME3_M, 0, 32*24*2, 1, inHeapID);
	GF_BGL_LoadScreenReq(ini, GF_BGL_FRAME3_M);

	// サブ画面BGパレット転送
	ArcUtil_PalSet(	ARC_GUINNESS_GRA, NARC_guinness_guinness_bg_u_nclr, PALTYPE_SUB_BG,
					0, 32*SUB_PAL_NUM, inHeapID);
	// サブ画面BGキャラ転送
	ArcUtil_BgCharSet(ARC_GUINNESS_GRA, NARC_guinness_guinness_bg_u_lz_ccgr, ini,
			    GF_BGL_FRAME0_S, 0, 32*1*0x20, 1, inHeapID);
	// メイン画面スクリーン
	ArcUtil_ScrnSet(ARC_GUINNESS_GRA, NARC_guinness_guinness_bg_u_lz_cscr, ini,
			  GF_BGL_FRAME0_S, 0, 32*24*2, 1, inHeapID);
	GF_BGL_LoadScreenReq(ini, GF_BGL_FRAME0_S);

}

//------------------------------------------------------------------
/**
 * @brief	セルアクターの初期化
 * @param	work		ワークポインタ
 * @param	inHeapID	ヒープＩＤ
 * @return	NONE
 */
//------------------------------------------------------------------
static void InitCellActor(GNS_WORK *work, const int inHeapID)
{
	int i;
	// セルアクター初期化
	work->ClactSet = CLACT_U_SetEasyInit( CELL_ACTOR_MAX, &work->RendData, inHeapID);

	//リソースマネージャー初期化
	for(i=0;i<CLACT_U_RES_MAX;i++){	//リソースマネージャー作成
		work->ResMan[i] = CLACT_U_ResManagerInit(1, i, inHeapID);
	}

	//---------上画面用-------------------
	//chara読み込み
	work->ResObjTbl[CLACT_U_CHAR_RES] =
		CLACT_U_ResManagerResAddArcChar(work->ResMan[CLACT_U_CHAR_RES],
					    ARC_GUINNESS_GRA, NARC_guinness_guinness_obj_d_lz_ccgr,
					    1, 0, NNS_G2D_VRAM_TYPE_2DMAIN, inHeapID);

	//pal読み込み
	work->ResObjTbl[CLACT_U_PLTT_RES] =
		CLACT_U_ResManagerResAddArcPltt(work->ResMan[CLACT_U_PLTT_RES],
					    ARC_GUINNESS_GRA, NARC_guinness_guinness_obj_d_nclr,
					    0, 0, NNS_G2D_VRAM_TYPE_2DMAIN, 4, inHeapID);

	//cell読み込み
	work->ResObjTbl[CLACT_U_CELL_RES] =
		CLACT_U_ResManagerResAddArcKindCell(work->ResMan[CLACT_U_CELL_RES],
						ARC_GUINNESS_GRA, NARC_guinness_guinness_obj_d_lz_ccer,
						1, 0, CLACT_U_CELL_RES,inHeapID);

	//同じ関数でanim読み込み
	work->ResObjTbl[CLACT_U_CELLANM_RES] =
		CLACT_U_ResManagerResAddArcKindCell(work->ResMan[CLACT_U_CELLANM_RES],
						ARC_GUINNESS_GRA, NARC_guinness_guinness_obj_d_lz_canr,
						1, 0, CLACT_U_CELLANM_RES,inHeapID);
	// Chara転送
	CLACT_U_CharManagerSetAreaCont( work->ResObjTbl[CLACT_U_CHAR_RES] );
	// パレット転送
	CLACT_U_PlttManagerSet( work->ResObjTbl[CLACT_U_PLTT_RES] );
}

//------------------------------------------------------------------
/**
 * @brief	セルアクターヘッダの作成
 * @param	work		ワークポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
static void MakeCellActorHeader(GNS_WORK *work)
{
	// セルアクターヘッダ作成
	CLACT_U_MakeHeader(&work->ClActHeader, 0, 0, 0, 0, CLACT_U_HEADER_DATA_NONE, CLACT_U_HEADER_DATA_NONE,
			     0, OBJ_BG_PRI,
			     work->ResMan[CLACT_U_CHAR_RES],
				 work->ResMan[CLACT_U_PLTT_RES],
			     work->ResMan[CLACT_U_CELL_RES],
				 work->ResMan[CLACT_U_CELLANM_RES],
			     NULL,NULL);
}

//------------------------------------------------------------------
/**
 * @brief	セルアクター削除
 * @param	work		ワークポインタ
 *
 * @return	NONE
 */
//------------------------------------------------------------------
static void DeleteCellActor(GNS_WORK *work)
{
	int i;
	//カーソル
	if(work->Cur){
		CLACT_Delete(work->Cur);
	}
	//矢印
	if(work->BtnR){
		CLACT_Delete(work->BtnR);
	}
	if(work->BtnL){
		CLACT_Delete(work->BtnL);
	}
	//やめるボタン
	if(work->ExitBtn){
		CLACT_Delete(work->ExitBtn);
	}
	//削除ボタン
	if(work->DelBtn){
		CLACT_Delete(work->DelBtn);
	}
}

//------------------------------------------------------------------
/**
 * @brief	CLACT_ADDの雛形を作成
 *
 * @param	add			アクターアッドポインタ
 * @param	work		ワークポインタ
 *
 * @return	NONE
 */
//------------------------------------------------------------------
static void MakeCLACT_ADD(CLACT_ADD *add, GNS_WORK *work)
{
  add->ClActSet		= work->ClactSet;
  add->ClActHeader	= &work->ClActHeader;
  add->mat.z		= 0;
  add->sca.x		= FX32_ONE;
  add->sca.y		= FX32_ONE;
  add->sca.z		= FX32_ONE;
  add->rot		= 0;
  add->pri		= 0;
  add->DrawArea		= NNS_G2D_VRAM_TYPE_2DMAIN;
  add->heap		= HEAPID_GUINNESS;
}

//------------------------------------------------------------------
/**
 * @brief	アクター作成
 * @param	work		ワークポインタ
 *
 * @return	NONE
 */
//------------------------------------------------------------------
static void MakeActor(GNS_WORK *work)
{
	CLACT_ADD add;
	CLACT_WORK_PTR p;
	u8 idx = CUR_POS_MAX-1;

	MakeCLACT_ADD(&add, work);

	//カーソル
	add.mat.x = FX32_ONE * CurPos[idx].X;
	add.mat.y = FX32_ONE * CurPos[idx].Y;
	p = CLACT_Add(&add);
	CLACT_SetAnmFlag(p, 1);
	CLACT_AnmChg(p, CurPos[idx].Anm);
	CLACT_BGPriorityChg(p, 1);
	CLACT_SetDrawFlag(p, 1);
	work->Cur = p;

	//矢印
	add.mat.x = FX32_ONE * ARW_L_X;
	add.mat.y = FX32_ONE * ARW_L_Y;
	p = CLACT_Add(&add);
	CLACT_SetAnmFlag(p, 1);
	CLACT_AnmChg(p, ARW_L_ANM);
	CLACT_SetDrawFlag(p, 1);
	work->BtnL = p;

	add.mat.x = FX32_ONE * ARW_R_X;
	add.mat.y = FX32_ONE * ARW_R_Y;
	p = CLACT_Add(&add);
	CLACT_SetAnmFlag(p, 1);
	CLACT_AnmChg(p, ARW_R_ANM);
	CLACT_SetDrawFlag(p, 1);
	work->BtnR = p;

	//やめるボタン
	add.mat.x = FX32_ONE * EXIT_X;
	add.mat.y = FX32_ONE * EXIT_Y;
	p = CLACT_Add(&add);
	CLACT_SetAnmFlag(p, 1);
	CLACT_AnmChg(p, EXIT_ANM);
	CLACT_SetDrawFlag(p, 1);
	work->ExitBtn = p;

	//削除ボタン
	add.mat.x = FX32_ONE * DEL_X;
	add.mat.y = FX32_ONE * DEL_Y;
	p = CLACT_Add(&add);
	CLACT_SetAnmFlag(p, 1);
	CLACT_AnmChg(p, DEL_ANM);
	CLACT_SetDrawFlag(p, 1);
	work->DelBtn = p;

}

//------------------------------------------------------------------
/**
 * @brief	アクター作成
 * @param	work		ワークポインタ
 * @param	inHeapID
 *
 * @return	NONE
 */
//------------------------------------------------------------------
static void MakeTouchData(GNS_WORK *work, const int inHeapID)
{
	int i;
	RECT_HIT_TBL *rect;
	work->TouchRect = sys_AllocMemory(inHeapID, sizeof(RECT_HIT_TBL)*TOUCH_RECT_MAX);

	//ギネス６項目矩形
	for (i=0;i<GNS_NUM;i++){
		rect = &work->TouchRect[i];
		rect->rect.top    = TP_GNS_BASE_Y + (TP_GNS_H*i);
  		rect->rect.left   = TP_GNS_BASE_X;
  		rect->rect.bottom = rect->rect.top + TP_GNS_H;
  		rect->rect.right  = rect->rect.left + TP_GNS_W;
	}
	//Ｘボタン削除矩形
	{
		rect = &work->TouchRect[DEL_TP_IDX];
		rect->rect.top    = TP_DEL_BASE_Y;
  		rect->rect.left   = TP_DEL_BASE_X;
  		rect->rect.bottom = rect->rect.top + TP_DEL_H;
  		rect->rect.right  = rect->rect.left + TP_DEL_W;
	}
	//やめる矩形
	{
		rect = &work->TouchRect[EXIT_TP_IDX];
		rect->rect.top    = TP_EXIT_BASE_Y;
  		rect->rect.left   = TP_EXIT_BASE_X;
  		rect->rect.bottom = rect->rect.top + TP_EXIT_H;
  		rect->rect.right  = rect->rect.left + TP_EXIT_W;
	}
	//矢印円形
	{
		rect = &work->TouchRect[L_TP_IDX];
		rect->circle.code = TP_USE_CIRCLE;
  		rect->circle.x   = TP_L_BASE_X;
  		rect->circle.y = TP_L_BASE_Y;
  		rect->circle.r  = TP_L_RANGE;
		rect = &work->TouchRect[R_TP_IDX];
		rect->circle.code = TP_USE_CIRCLE;
  		rect->circle.x   = TP_R_BASE_X;
  		rect->circle.y = TP_R_BASE_Y;
  		rect->circle.r  = TP_R_RANGE;
	}
}

//------------------------------------------------------------------
/**
 * @brief	入力リクエスト
 * @param	work		ワークポインタ
 * @param	outParam	パラメータ
 *
 * @return	REQ_TYPE	リクエスト
 */
//------------------------------------------------------------------
static REQ_TYPE GetRequest(GNS_WORK *work, int *outParam)
{
	int key = 0;
	int selno;
	//まず、タッチしているかを判断する
	if ( !GF_TP_GetCont() ){	//キーコントロール
		//画面にタッチしていないなら、キー受付
		key = sys.trg;
		if(key){
			switch(key){
			case PAD_KEY_LEFT:
				return REQ_LEFT;
			case PAD_KEY_RIGHT:
				return REQ_RIGHT;
			case PAD_KEY_UP:
				return REQ_CUR_UP;
			case PAD_KEY_DOWN:
				return REQ_CUR_DOWN;
			case PAD_BUTTON_X:
				return REQ_DEL;
			case PAD_BUTTON_DECIDE:
				return REQ_DECIDE;
			case PAD_BUTTON_CANCEL:
				return REQ_EXIT;
			}
		}
	}

	if ( !key && GF_TP_GetTrg()){	//タッチコントロール
		selno = GF_TP_HitTrg((const RECT_HIT_TBL *)work->TouchRect);
		if(selno != RECT_HIT_NONE){
			switch(selno){
			case 0:
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:		//ギネス
				*outParam = selno;
				return REQ_CUR_JUMP;
			case 6:		//削除
				return REQ_DEL;
			case 7:		//やめる
				*outParam = selno;
				return REQ_EXIT;
			case 8:		//左
				return REQ_LEFT;
			case 9:		//右
				return REQ_RIGHT;
			}
		}
	}

	return REQ_NONE;
}

//------------------------------------------------------------------
/**
 * @brief	ビューモード
 * @param	work		ワークポインタ
 * @param	inReq		リクエスト
 * @param	inParam		パラメータ
 *
 * @return	BOOL		TRUEなら、アプリ終了
 */
//------------------------------------------------------------------
static BOOL ViewModeMain(GNS_WORK *work, const REQ_TYPE inReq, const int inParam)
{
	//リクエストで分岐
	switch(inReq){
	case REQ_LEFT:	//ページ切り替え
		ChgSelBlock(work, -1);
		break;
	case REQ_RIGHT:	//ページ切り替え
		ChgSelBlock(work, 1);
		break;
	case REQ_DEL:	//削除モードへ
		//削除モードへＳＥ
		Snd_SePlay(SE_CHG_DEL);
		//ボタンアニメ
		CLACT_AnmChg(work->DelBtn, AF_DEL_ANM);
		ChgMode(work, GNS_MODE_DEL);
		break;
	case REQ_DECIDE:	//決定
	case REQ_EXIT:	//アプリ終了
		//やめるＳＥ
		Snd_SePlay(SE_EXIT);
		//ボタンアニメ
		CLACT_AnmChg(work->ExitBtn, AF_EXIT_ANM);
		return TRUE;
	}

	return FALSE;
}

//------------------------------------------------------------------
/**
 * @brief	削除モード
 * @param	work		ワークポインタ
 * @param	inReq		リクエスト
 * @param	inParam		パラメータ
 *
 * @return
 */
//------------------------------------------------------------------
static void DelModeMain(GNS_WORK *work, const REQ_TYPE inReq, const int inParam)
{
	//リクエストで分岐
	switch(inReq){
	case REQ_CUR_UP:	//カーソル上に移動
		MoveCursor(work, -1);
		break;
	case REQ_CUR_DOWN:	//カーソル下に移動
		MoveCursor(work, 1);
		break;
	case REQ_CUR_JUMP:	//カーソルを指定場所にジャンプ
		JumpCursor(work, inParam);
		break;
	case REQ_DEL:	//削除ＹＥＳＮＯ確認へ（カーソルの位置により機能が分岐）
		if (  work->CurPosIdx < work->RecListNum){			//ギネス記録にカーソルがある場合
			//削除項目決定ＳＥ
			Snd_SePlay(SE_SELECT);
			YesnoCheckReady(work);	//削除ＹＥＳＮＯ確認へ
		}else{			//やめるボタンにカーソルがある場合
			//やめるＳＥ
			Snd_SePlay(SE_EXIT);
			//ボタンアニメ
			CLACT_AnmChg(work->ExitBtn, AF_EXIT_ANM);
			ChgMode(work, GNS_MODE_VIEW);	//ビューモードへ
		}
		break;
	case REQ_EXIT:	//ビューモードへ
		//やめるＳＥ
		Snd_SePlay(SE_EXIT);
		//ボタンアニメ
		CLACT_AnmChg(work->ExitBtn, AF_EXIT_ANM);
		ChgMode(work, GNS_MODE_VIEW);
		break;
	case REQ_DECIDE:	//決定（カーソルの位置により機能が分岐）
		if (  work->CurPosIdx < work->RecListNum){			//ギネス記録にカーソルがある場合
			//削除項目決定ＳＥ
			Snd_SePlay(SE_SELECT);
			YesnoCheckReady(work);	//削除ＹＥＳＮＯ確認へ
		}else{			//やめるボタンにカーソルがある場合
			//やめるＳＥ
			Snd_SePlay(SE_EXIT);
			//ボタンアニメ
			CLACT_AnmChg(work->ExitBtn, AF_EXIT_ANM);
			ChgMode(work, GNS_MODE_VIEW);	//ビューモードへ
		}
		break;
	}
}

//------------------------------------------------------------------
/**
 * @brief	カーソルの上下移動
 * @param	work		ワークポインタ
 * @param	inAddVal	移動量
 *
 * @return	none
 */
//------------------------------------------------------------------
static void MoveCursor(GNS_WORK *work, const int inAddVal)
{
	if ( inAddVal > 0 ){
		//現在位置が「やめる」の位置の場合
		if (work->CurPosIdx == CUR_POS_MAX-1){
			work->CurPosIdx = 0;		//リストの先頭へ
		}else{
			if (work->CurPosIdx + inAddVal>=work->RecListNum){
				//「やめる」の位置へ
				work->CurPosIdx = CUR_POS_MAX-1;
			}else{
				work->CurPosIdx += inAddVal;
			}
		}
	}else if ( inAddVal < 0 ){
		//現在位置が「やめる」の位置の場合
		if (work->CurPosIdx == CUR_POS_MAX-1){
			work->CurPosIdx = work->RecListNum-1;		//リストの末尾へ
		}else{
			if (work->CurPosIdx + inAddVal < 0){
				//「やめる」の位置へ
				work->CurPosIdx = CUR_POS_MAX-1;
			}else{
				work->CurPosIdx += inAddVal;
			}
		}
	}
	//カーソル移動音
	Snd_SePlay(SE_MOVE);

	UpdateCursor(work);
}

//------------------------------------------------------------------
/**
 * @brief	カーソルのジャンプ移動
 * @param	work		ワークポインタ
 * @param	inCurPosIdx　カーソルジャンプインデックス
 *
 * @return	none
 */
//------------------------------------------------------------------
static void JumpCursor(GNS_WORK *work, const int inCurPosIdx)
{
	//指定位置がデータ数範囲内か「やめる」の位置の場合は処理する
	if ( (inCurPosIdx == CUR_POS_MAX-1) || (inCurPosIdx < work->RecListNum) ){
		//カーソル移動音
		Snd_SePlay(SE_MOVE);

		work->CurPosIdx = inCurPosIdx;
		UpdateCursor(work);
	}
}

//------------------------------------------------------------------
/**
 * @brief	カーソルアクター更新
 * @param	work		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void UpdateCursor(GNS_WORK *work)
{
	u8 idx;
	VecFx32 pos = {0,0,0};

	idx = work->CurPosIdx;
	pos.x = CurPos[idx].X * FX32_ONE;
	pos.y = CurPos[idx].Y * FX32_ONE;
	CLACT_SetMatrix(work->Cur, &pos);
	CLACT_AnmChg(work->Cur, CurPos[idx].Anm);
}

//------------------------------------------------------------------
/**
 * @brief	選択ブロック変更
 * @param	work		ワークポインタ
 * @param	inAddVal	変更値
 *
 * @return	none
 */
//------------------------------------------------------------------
static void ChgSelBlock(GNS_WORK *work, const s8 inAddVal)
{
	int sel;
	sel = work->SelBlock;

	sel += inAddVal;

	if ( sel < 0){
		//末尾へ
		sel = work->BlockNum-1;
	}else if(sel >= work->BlockNum){
		//先頭へ
		sel = 0;
	}

	work->SelBlock = sel;
	OS_Printf("現在の選択ブロック%d\n",sel);

	//切り替えＳＥ
	Snd_SePlay(SE_PAGE);
	//ボタンアニメ
	if (inAddVal > 0){
		CLACT_AnmChg(work->BtnR, AF_ARW_R_ANM);
	}else if(inAddVal < 0){
		CLACT_AnmChg(work->BtnL, AF_ARW_L_ANM);
	}

	//タイトル変更
	TitleWinWrite(work);

	//再描画シーンへシフト
	work->Scene =  SCENE_REWRITE;
}

//------------------------------------------------------------------
/**
 * @brief	モード変更
 * @param	work		ワークポインタ
 * @param	inMode		モード
 *
 * @return	none
 */
//------------------------------------------------------------------
static void ChgMode(GNS_WORK *work, const GNS_MODE inMode)
{
	work->Mode = inMode;
	if (inMode == GNS_MODE_VIEW){
		work->CurPosIdx = CUR_POS_MAX - 1;
		//矢印表示
		CLACT_SetDrawFlag(work->BtnR, 1);
		CLACT_SetDrawFlag(work->BtnL, 1);

		//会話ウィンドウ消す
		ClearTalkWin(work);
	}else{
		work->CurPosIdx = 0;
		//矢印消す
		CLACT_SetDrawFlag(work->BtnR, 0);
		CLACT_SetDrawFlag(work->BtnL, 0);

		//会話ウィンドウに説明表示
		WhichWinWrite(work);
	}

	UpdateCursor(work);
}

//------------------------------------------------------------------
/**
 * @brief	BMPウィンドウ作成
 * @param	work		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void CreateBmpWin(GNS_WORK *work)
{
	//システム用フォントパレット転送
	SystemFontPaletteLoad(PALTYPE_MAIN_BG, FONT_PALNO_NORMAL*32, HEAPID_GUINNESS);

	GF_BGL_BmpWinAdd(work->Bgl, &work->RnkWin,GF_BGL_FRAME1_M,RNK_WIN_PX,RNK_WIN_PY,
			RNK_WIN_SX,RNK_WIN_SY, FONT_PALNO_NORMAL, RNK_WIN_CGX);
	GF_BGL_BmpWinAdd(work->Bgl, &work->BmpWin,GF_BGL_FRAME1_M,LIST_WIN_PX,LIST_WIN_PY,
			LIST_WIN_SX,LIST_WIN_SY, FONT_PALNO_NORMAL, LIST_WIN_CGX);
	GF_BGL_BmpWinAdd(work->Bgl, &work->MsgWin,GF_BGL_FRAME2_M,MSG_WIN_PX,MSG_WIN_PY,
			MSG_WIN_SX,MSG_WIN_SY, FONT_PALNO_NORMAL, MSG_WIN_CGX);
	GF_BGL_BmpWinAdd(work->Bgl, &work->ExitWin,GF_BGL_FRAME2_M,EXIT_WIN_PX,EXIT_WIN_PY,
			EXIT_WIN_SX,EXIT_WIN_SY, BTN_FONT_PALNO, EXIT_WIN_CGX);
	GF_BGL_BmpWinAdd(work->Bgl, &work->DelWin,GF_BGL_FRAME2_M,DEL_WIN_PX,DEL_WIN_PY,
			DEL_WIN_SX,DEL_WIN_SY, BTN_FONT_PALNO, DEL_WIN_CGX);
	GF_BGL_BmpWinAdd(work->Bgl, &work->YNMsgWin,GF_BGL_FRAME0_M,YN_MSG_WIN_PX,YN_MSG_WIN_PY,
			YN_MSG_WIN_SX,YN_MSG_WIN_SY, FONT_PALNO_NORMAL, YN_MSG_WIN_CGX);

	TalkWinGraphicSet(work->Bgl,GF_BGL_FRAME0_M,
			TALK_WIN_CGX, TALK_WIN_PAL, work->WinType, HEAPID_GUINNESS);

}

//------------------------------------------------------------------
/**
 * @brief	上部会話ウィンドウクリア
 * @param	work		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void ClearTalkWin(GNS_WORK *work)
{
	BmpTalkWinClear( &work->YNMsgWin, WINDOW_TRANS_OFF);
	GF_BGL_BmpWinOff(&work->YNMsgWin);
}

//////////////////////////////////////////////////////////////////////////////////////////////

//------------------------------------------------------------------
/**
 * @brief	モード別にセーブデータ取得
 * @param	wk		ワークポインタ
 * @param	sv			セーブデータ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void GetSaveData(GNS_WORK *wk, SAVEDATA* sv)
{
	int heap = HEAPID_GUINNESS;
	int i,j,ct,flag;
	GNS_RANKING*	gp;

	//レコードリスト操作用メモリ取得
	wk->ViewList = sys_AllocMemory(heap,sizeof(RANK_LIST)*wk->BlockNum);
	MI_CpuClear8(wk->ViewList,sizeof(RANK_LIST)*wk->BlockNum);

	//自分のレコードデータ
	wk->Rank[0] = GNSRank_AllocMyData(sv, wk->DataType, heap);

	//レコードランキングデータ
	for(i = 0;i < wk->BlockNum;i++){
		wk->Rank[i+1] = GNSRank_AllocRankingData(wk->GnsSave,
			(wk->GrpType*GNS_RECORD_NUM)+wk->GnsIdx+i,heap);

		gp = wk->Rank[i+1];
		ct = 0;
		flag = 0;

		if(gp->num == 0){
			//自分だけ
			wk->ViewList[i].List[0].GnsRec = &(wk->Rank[0]->rank[i]);
			wk->ViewList[i].List[0].ValidFlg = 1;
			wk->ViewList[i].List[0].MyID = 0xFF;
			wk->ViewList[i].Num = 1;
		}else{
			for(j = 0;j < gp->num;j++){
				if(	(flag == 0) &&
					(wk->Rank[0]->rank[i].record >= gp->rank[j].record)){
					//自分を挿入
					wk->ViewList[i].List[ct].GnsRec = &(wk->Rank[0]->rank[i]);
					wk->ViewList[i].List[ct].ValidFlg = 1;
					wk->ViewList[i].List[ct].MyID = 0xFF;
					++ct;
					wk->ViewList[i].List[ct].GnsRec = &(gp->rank[j]);
					wk->ViewList[i].List[ct].ValidFlg = 1;
					wk->ViewList[i].List[ct].MyID = j;
					flag = 1;
				}else{
					wk->ViewList[i].List[ct].GnsRec = &(gp->rank[j]);
					wk->ViewList[i].List[ct].ValidFlg = 1;
					wk->ViewList[i].List[ct].MyID = j;
				}
				++ct;
			}
			if(!flag){
				//最後に自分を追加
				wk->ViewList[i].List[ct].GnsRec = &(wk->Rank[0]->rank[i]);
				wk->ViewList[i].List[ct].ValidFlg = 1;
				wk->ViewList[i].List[ct].MyID = 0xFF;
			}
			wk->ViewList[i].Num = gp->num+1;
		}
	}
}

//------------------------------------------------------------------
/**
 * @brief	メッセージデフォルトリソース取得
 * @param	wk		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void GetMsgData(GNS_WORK *wk)
{
	int i;
	int heap = HEAPID_GUINNESS;

	wk->Msg.Man = MSGMAN_Create(MSGMAN_TYPE_NORMAL,ARC_MSG,
			NARC_msg_ranking_dat, heap);

	wk->Msg.WordSet = WORDSET_CreateEx(2,WORDSET_RANKING_BUFLEN, heap);

	//デフォルト文字列取得
	wk->Msg.tmp = STRBUF_Create(WORDSET_RANKING_BUFLEN, heap);

	//名前展開場所
	wk->Msg.nbuf = MSGMAN_AllocString(wk->Msg.Man,msg_rk_name_01);
	//順位
	wk->Msg.rnkbuf = MSGMAN_AllocString(wk->Msg.Man,msg_rk_no_01);

	//カウント
	for(i = 0;i < UNITBUF_NUM;i++){
		wk->Msg.ubuf[i] =
			MSGMAN_AllocString(wk->Msg.Man,msg_rk_count_00+i);
	}

}

//------------------------------------------------------------------
/**
 * @brief	メッセージデフォルトリソース破棄
 * @param	wk		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void FreeMsgData(GNS_WORK *wk)
{
	int i;

	for(i = 0;i < UNITBUF_NUM;i++){
		STRBUF_Delete(wk->Msg.ubuf[i]);
	}

	STRBUF_Delete(wk->Msg.nbuf);
	STRBUF_Delete(wk->Msg.rnkbuf);

	STRBUF_Delete(wk->Msg.tmp);

	WORDSET_Delete(wk->Msg.WordSet);
	MSGMAN_Delete(wk->Msg.Man);
}

//------------------------------------------------------------------
/**
 * @brief	レコードメニュー描画
 * @param	wk		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void RecordMenuWrite(GNS_WORK *wk)
{
	int i,size,rank,ct,value,value2;
	RANK_LIST* lp;
	const RANK_UNIT*	up;

	lp = &(wk->ViewList[wk->SelBlock]);
	up = &(unit_list[wk->DataType][wk->SelBlock]);

	GF_BGL_BmpWinDataFill(&wk->BmpWin,MSG_FONT_COLOR);
	GF_BGL_BmpWinDataFill(&wk->RnkWin,MSG_FONT_COLOR);

	size = lp->Num;
	rank = 1;
	ct = 0;
	value2 = 0;
	//表示データ数クリア
	wk->RecListNum = 0;
	for(i = 0;i < lp->Num;i++){
		if(!lp->List[i].ValidFlg){
			continue;
		}
		//ランキングナンバーを算出
		value = lp->List[i].GnsRec->record;
		if(value > up->Max){
			value = up->Max;
		}
		if(value < value2){
			++rank;
		}
		//ランキングと名前
		WORDSET_RegisterNumber(wk->Msg.WordSet,0,rank,1,
					NUMBER_DISPTYPE_SPACE,NUMBER_CODETYPE_DEFAULT);
		WORDSET_ExpandStr(wk->Msg.WordSet, wk->Msg.tmp, wk->Msg.rnkbuf);
		GF_STR_PrintColor(&wk->RnkWin, FONT_SYSTEM, wk->Msg.tmp,
			0, ct*16, MSG_NO_PUT, MSG_FONT_COLOR, NULL );

		WORDSET_RegisterWord( wk->Msg.WordSet,1,
					lp->List[i].GnsRec->name,PM_NEUTRAL,TRUE,PM_LANG);
		WORDSET_ExpandStr(wk->Msg.WordSet, wk->Msg.tmp, wk->Msg.nbuf);
		GF_STR_PrintColor(&wk->BmpWin, FONT_SYSTEM, wk->Msg.tmp,
			0, ct*16, MSG_NO_PUT, MSG_FONT_COLOR, NULL );
		//レコード
		WORDSET_RegisterNumber(wk->Msg.WordSet,0,value,up->Keta,
				NUMBER_DISPTYPE_SPACE,NUMBER_CODETYPE_DEFAULT);
		WORDSET_ExpandStr(wk->Msg.WordSet, wk->Msg.tmp,
				wk->Msg.ubuf[up->Unit-msg_rk_count_00]);
		GF_STR_PrintColor(&wk->BmpWin, FONT_SYSTEM,wk->Msg.tmp,
			(LIST_WIN_SX*8)-FontProc_GetPrintStrWidth(FONT_SYSTEM,wk->Msg.tmp,0),
			ct*16, MSG_NO_PUT, MSG_FONT_COLOR, NULL );
		wk->ListIdx[ct] = i;

		value2 = value;	//ひとつ前の値を覚えておく

		if(++ct >= 6){
			break;	//描画するリストは6まで
		}
	}

	GF_BGL_BmpWinOn(&wk->BmpWin);
	GF_BGL_BmpWinOn(&wk->RnkWin);

	//現在の表示レコード数を保存
	wk->RecListNum = ct;

	if (wk->Mode == GNS_MODE_DEL){
		//カーソル位置が、範囲外にある場合はリストの末尾に移動させる
		if (wk->CurPosIdx >= wk->RecListNum){
			GF_ASSERT(wk->CurPosIdx!=EXIT_TP_IDX);
			wk->CurPosIdx = wk->RecListNum-1;
			UpdateCursor(wk);
		}
	}
}

//------------------------------------------------------------------
/**
 * @brief	削除ウィンドウ描画
 * @param	wk		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void DelWinWrite(GNS_WORK *wk)
{
	STRBUF* buf;
	GF_BGL_BmpWinDataFill(&wk->DelWin,MSG_BTN_FONT_COLOR);

	buf = MSGMAN_AllocString( wk->Msg.Man, msg_rk_delete_01 );

	GF_STR_PrintColor(&wk->DelWin, FONT_TOUCH, buf,
			0,0, MSG_NO_PUT, MSG_BTN_FONT_COLOR, NULL );

	STRBUF_Delete(buf);
	GF_BGL_BmpWinOn(&wk->DelWin);
}

//------------------------------------------------------------------
/**
 * @brief	やめるウィンドウ描画
 * @param	wk		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void ExitWinWrite(GNS_WORK *wk)
{
	STRBUF* buf;
	GF_BGL_BmpWinDataFill(&wk->ExitWin,MSG_BTN_FONT_COLOR);

	buf = MSGMAN_AllocString( wk->Msg.Man, msg_rk_return_01 );

	GF_STR_PrintColor(&wk->ExitWin, FONT_TOUCH, buf,
			0,0, MSG_NO_PUT, MSG_BTN_FONT_COLOR, NULL );

	STRBUF_Delete(buf);

	GF_BGL_BmpWinOn(&wk->ExitWin);
}

//------------------------------------------------------------------
/**
 * @brief	確認ウィンドウ描画
 * @param	wk		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void DelOKWinWrite(GNS_WORK *wk)
{
	STRBUF* buf;
	RANK_LIST* lp;
	u8 list_idx;

	list_idx = wk->ListIdx[wk->CurPosIdx];

	lp = &(wk->ViewList[wk->SelBlock]);

	BmpTalkWinWrite( &wk->YNMsgWin, WINDOW_TRANS_OFF, TALK_WIN_CGX, TALK_WIN_PAL);
	GF_BGL_BmpWinDataFill(&wk->YNMsgWin, APP_WINCLR_COL(FBMP_COL_WHITE));

	WORDSET_RegisterWord( wk->Msg.WordSet,0,
				lp->List[list_idx].GnsRec->name,PM_NEUTRAL,TRUE,PM_LANG);
	buf = MSGDAT_UTIL_AllocExpandString(wk->Msg.WordSet, wk->Msg.Man, msg_rk_msg_02, HEAPID_GUINNESS);

	GF_STR_PrintColor(&wk->YNMsgWin, FONT_SYSTEM, buf,
			0,0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );

	STRBUF_Delete(buf);

	GF_BGL_BmpWinOn(&wk->YNMsgWin);
}

//------------------------------------------------------------------
/**
 * @brief	自分データ削除警告ウィンドウ描画
 * @param	wk		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void DelMyDatWinWrite(GNS_WORK *wk)
{
	STRBUF* buf;

	BmpTalkWinWrite( &wk->YNMsgWin, WINDOW_TRANS_OFF, TALK_WIN_CGX, TALK_WIN_PAL);
	GF_BGL_BmpWinDataFill(&wk->YNMsgWin, APP_WINCLR_COL(FBMP_COL_WHITE));

	buf = MSGMAN_AllocString( wk->Msg.Man,msg_rk_msg_03 );

	GF_STR_PrintColor(&wk->YNMsgWin, FONT_SYSTEM, buf,
			0,0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );

	STRBUF_Delete(buf);

	GF_BGL_BmpWinOn(&wk->YNMsgWin);
}

//------------------------------------------------------------------
/**
 * @brief	タイトルウィンドウ描画
 * @param	wk		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void TitleWinWrite(GNS_WORK *wk)
{
	STRBUF* buf1;
	STRBUF* buf2;
	int msg_id1, msg_id2, msg_id_base;
	GF_BGL_BmpWinDataFill(&wk->MsgWin,MSG_FONT_COLOR);

	if (wk->DataType == 0){	//バトル
		msg_id_base = msg_rk_guide_01_01;
	}else {		//ポケ
		msg_id_base = msg_rk_guide_07_01;
	}
	msg_id1 = msg_id_base + wk->SelBlock*2;
	msg_id2 = msg_id1+1;

	buf1 = MSGMAN_AllocString( wk->Msg.Man, msg_id1 );
	buf2 = MSGMAN_AllocString( wk->Msg.Man, msg_id2 );

	GF_STR_PrintColor(&wk->MsgWin, FONT_SYSTEM, buf1,
			0,0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );
	GF_STR_PrintColor(&wk->MsgWin, FONT_SYSTEM, buf2,
			0,16, MSG_NO_PUT, MSG_FONT_COLOR, NULL );

	STRBUF_Delete(buf1);
	STRBUF_Delete(buf2);

	GF_BGL_BmpWinOn(&wk->MsgWin);
}

//------------------------------------------------------------------
/**
 * @brief	どのデータを消すかウィンドウ描画
 * @param	wk		ワークポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void WhichWinWrite(GNS_WORK *wk)
{
	STRBUF* buf;

	BmpTalkWinWrite( &wk->YNMsgWin, WINDOW_TRANS_OFF, TALK_WIN_CGX, TALK_WIN_PAL);
	GF_BGL_BmpWinDataFill(&wk->YNMsgWin, APP_WINCLR_COL(FBMP_COL_WHITE));

	buf = MSGMAN_AllocString( wk->Msg.Man, msg_rk_msg_01 );

	GF_STR_PrintColor(&wk->YNMsgWin, FONT_SYSTEM, buf,
			0,0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );

	STRBUF_Delete(buf);

	GF_BGL_BmpWinOn(&wk->YNMsgWin);
}

//--------------------------------------------------------------------------------------------
/**
 * YESNO確認準備
 *
 * @param	work		ワークポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void YesnoCheckReady(GNS_WORK *work)
{
	// はい／いいえ選択
	TOUCH_SW_PARAM param;

	OS_Printf("sel_block:%d\n",work->SelBlock);
	OS_Printf("curidx:%d\n",work->CurPosIdx);
	OS_Printf("listidx:%d\n",work->ListIdx[work->CurPosIdx]);

	//消す候補セット
	work->DelRank = &(work->ViewList[work->SelBlock].List[work->ListIdx[work->CurPosIdx]]);
	//自分のデータは消せない
	if (work->DelRank->MyID == 0xff){
		//自分のデータなので消せない
		work->Scene = SCENE_DEL_NG;
		//警告メッセージ
		DelMyDatWinWrite(work);
		//NGのSE
		Snd_SePlay(SE_NG);
		return;
	}

	MI_CpuClear8(&param,sizeof(TOUCH_SW_PARAM));
	param.p_bgl		= work->Bgl;
	param.bg_frame	= GF_BGL_FRAME0_M;
	param.char_offs	= MENU_BMP_CHR_OFS;
	param.pltt_offs 	= YESNO_PAL;
	param.x		= YESNO_X;
	param.y		= YESNO_Y;
	TOUCH_SW_Init(work->TouchSubWindowSys, &param );

	//確認メッセージ
	DelOKWinWrite(work);
	//パッシブ状態
	SetPassive();

	//ＹＥＳＮＯメインへシーン変更
	work->Scene = SCENE_YESNO;
}

//------------------------------------------------------------------
/**
 * @brief	パッシブ状態セット
 * @param	none
 * @return	none
 */
//------------------------------------------------------------------
static void SetPassive(void)
{
	G2_SetBlendBrightness(
		GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 |
		GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_OBJ,
		BRIGHT_VAL
	);
}

//------------------------------------------------------------------
/**
 * @brief	パッシブ状態解除
 * @param	none
 * @return	none
 */
//------------------------------------------------------------------
static void ClearPassive(void)
{
	G2_BlendNone();
}

//------------------------------------------------------------------
/**
 * @brief	セーブデータへの反映
 * @param	wk		ワークポインタ
 * @return	none
 */
//------------------------------------------------------------------
static void SetSvData(GNS_WORK *wk)
{
	int i,j,ct;
	RANK*	lp;
	//セーブデータ反映処理
	for(i = 0; i < wk->BlockNum;i++){
		ct = 0;
		for(j = 0;j < wk->ViewList[i].Num;j++){
			lp = &(wk->ViewList[i].List[j]);
			if(lp->MyID == 0xFF || lp->ValidFlg){
				continue;
			}
			//セーブデータ削除
			GuinnessData_DelRecord(wk->GnsSave,(wk->GrpType*GNS_RECORD_NUM)+wk->GnsIdx+i,lp->MyID-ct);
			++ct;
		}
	}
}



